Merge pull request #506 from andrewcsmith/patch-2
[supercollider.git] / examples / GUI examples / GUI_examples1.scd
blob081f53e2793fa021db3fd762e46ba2fc948756ce
2 // GUI examples
4 GUI.cocoa;      // use CocoaGUI (Mac OS X native)
5 GUI.swing;      // use SwingGUI (Java based GUI)
7 ////////////////////////////////////////////////////////////////////////
10 // create a window. set properties from a routine.
11 // note: alpha transparency works on Mac OS X only!
12 var w, r;
13 w = Window("trem", Rect(512, 256, 360, 130));
14 w.front;
15 r = Routine({
16         60.do({ arg i;
17                 0.05.wait;
18                 w.bounds = w.bounds.moveBy(10.rand2, 10.rand2);
19                 w.alpha = cos(i*0.1pi)*0.5+0.5;
20         });
21         1.wait;
22         w.close;
23 });
24 AppClock.play(r);
27 ////////////////////////////////////////////////////////////////////////
30 // create an array of buttons.
31 var w;
33 w = Window("button panel", Rect(128, 64, 340, 360));
34 w.view.decorator = FlowLayout(w.view.bounds);
35 32.do({ arg i;
36 b = Button(w, Rect(0,0, 75, 24));
37 b.states = [["Start "++i, Color.black, Color.rand],["Stop "++i, Color.white, Color.red]];
39 });
40 //w.view.background = Color(0.6,0.8,0.8);
41 w.front;
44 ////////////////////////////////////////////////////////////////////////
47 // create a GUI window with some NumberBoxes.
48 // You can command click (CocoaGUI) or control click (SwingGUI) on a control
49 // to drag its value to another control
50 var w, n, f, s;
51 w = Window("number box test", Rect(128, 64, 260, 80));
52 w.view.decorator = f = FlowLayout(w.view.bounds);
54 n = NumberBox(w, Rect(0,0,80,24));
55 n.value = 123;
57 n = NumberBox(w, Rect(0,0,80,24));
58 n.value = 456;
60 n = DragBoth(w, Rect(0,0,80,24));
61 n.object = 789;
63 f.nextLine;
65 s = Slider(w, Rect(0,0,240,24));
67 w.front;
70 ////////////////////////////////////////////////////////////////////////
73 // create a GUI for a mixer.
74 var w, v, s, n;
76 w = Window("mixer", Rect(128, 64, 340, 360));
77 w.view.decorator = f = FlowLayout(w.view.bounds,Point(4,4),Point(4,2));
78 17.do({ arg i;
79         var v, s, n, spec, p, height = 16;
80         
81         v = StaticText(w, Rect(0, 0, 56, height+2));
82         if (i == 0, {
83                 v.font = Font("Helvetica", 13).boldVariant;
84                 v.stringColor = Color.yellow;
85         },{
86                 v.font = Font("Helvetica", 12);
87                 v.stringColor = Color.white;
88         });
89         v.align = \right;
90         s = Slider(w, Rect(0, 0, 182, height));
91         s.resize = 2;
92         spec = \db.asSpec;
93         s.action = { 
94                 var db;
95                 db = spec.map(s.value).round(0.1);
96                 //v.string = if (db < -100, { "-inf" },{ db.asString ++ " dB" });
97                 v.string = db.asString ++ " dB" ;
98         };
99         s.action.value;
101         n = StaticText(w, Rect(0, 0, 72, height+2));
102         if (i == 0, {
103                 n.string = "Master";
104                 n.stringColor = Color.yellow;
105                 n.font = Font("Helvetica", 13).boldVariant;
106         },{
107                 n.string = "Channel " ++ i;
108                 n.stringColor = Color.white;
109                 n.font = Font("Helvetica", 12);
110         });
111         n.background = Color.rand(0.1,0.5);
112         n.resize = 3;
113         
114         f.nextLine;
116 w.view.background = Color.blue; // fallback on SwingOSC
117 w.view.background = HiliteGradient(Color.blue, Color.green, \h, 128, 0.3);
118 w.front;
119 w.refresh;
122 ////////////////////////////////////////////////////////////////////////
125 // jumble of controls
127 w = Window.new;
129 a = Slider(w, Rect(20,20,114,24));
131 b = Button(w, Rect(20, 50, 80, 24));
133 b.states = [["Start Sound", Color.red, Color.grey(0.9)],["Stop Sound", Color.white, Color.grey(0.4)]];
135 c = DragSource(w, Rect(120, 50, 80, 24));
136 c.string = "DragSource";
137 c.font = Font("Helvetica", 12);
138 c.beginDragAction = { arg view; [view.object,view.object]; };
139 //c.stringColor = Color(0.5, 0.2, 0.7);
142 d = DragSink(w, Rect(120, 85, 80, 24));
143 d.string = "DragSink";
145 z = CompositeView(w, Rect(0,100,800,300));
147 l = Slider(z, Rect(20,120,180,24));
149 //l.backColor = Color(0,1,0);
150 //l.knobColor = Color(1,0,0);
151 l.step = 1/10;
153 r = RangeSlider(z, Rect(20,170,180,24));
154 r.step = 1/20;
156 q = RangeSlider(z, Rect(220, 170, 24, 180));
158 t = Slider2D(w, Rect(220,20, 80, 80));
159 t.action = { arg slider; c.object = slider.y.postln.round(0.001); };
161 p = Slider(z, Rect(248, 170, 24, 180));
162 p.action = { arg slider; slider.value.postln; };
164 w.front;
165 w.refresh;
168 // properties you can set in the window above.
169 w.view.background = Color.blue; // fallback on SwingOSC
170 w.view.background = HiliteGradient(Color.blue, Color.red, \v, 128, 0.2);
171 r.background = Color.gray; r.hi = 0.2;
173 z.visible = false;
174 z.visible = true;
176 z.enabled = false;      // NO EFFECT WITH SWINGOSC!
177 z.enabled = true;
178         
179 b.visible = false;
180 b.visible = true;
182 b.enabled = false;
183 b.enabled = true;
185 c.visible = false;
186 c.visible = true;
188 b.enabled = false;
189 b.visible = false;
190 b.visible = true;
191 b.enabled = true;
193 t.enabled = false;
194 t.enabled = true;
195 t.visible = false;
196 t.visible = true;
198 r.step = 0;
200 t.canFocus = false;
201 t.canFocus = true;
202 t.canFocus = false;
204 c.object = Point(3,4);
206 c.object = [1, 2, 3, 4];
207 c.object = 123.456;
208 c.object = WhiteNoise.ar(1);
209 c.object = WhiteNoise;
210 c.object = true;
212 t.resize = 2;
213 t.resize = 5;
214 t.resize = 7;
216 w.alpha = 0.7;
217 w.close;
219 ////////////////////////////////////////////////////////////////////////
221 // create a window to start and stop a synth
224 SynthDef("moto-rev", {
225         var x;
226         x = RLPF.ar(LFPulse.ar(SinOsc.kr(0.2, 0, 10, 21), [0,0.1], 0.1), 100, 0.1).clip2(0.4);
227         Out.ar(0, x);
228 }).writeDefFile;
232         var w, b1, b2, b3, name, a, s;
233         name = "moto-rev";
234         s = Server.local;
235         w = Window(name.asString, Rect(128, 64, 260, 80));
236         w.view.decorator = FlowLayout(w.view.bounds);
237         
238         b1 = Button(w, Rect(0,0, 80, 24));
239         b1.states = [["Load", Color.black, Color.green]];
240         b1.action = { arg view; 
241                 s.sendMsg("/d_load", SynthDef.synthDefDir ++ name ++ ".scsyndef");
242         };
243         b1.enabled = s.serverRunning;
244         
245         b2 = Button(w, Rect(0,0, 80, 24));
246         b2.states = [
247                 ["Play", Color.black, Color.green],
248                 ["Stop", Color.white, Color.red],
249         ];
250         b2.action = { arg view; 
251                 if (b2.value == 1, {
252                         s.sendMsg("/s_new", name, 1001, 1, 0);
253                 },{
254                         s.sendMsg("/n_free", 1001);
255                 });
256         };
257         b2.enabled = s.serverRunning;
259         a = SimpleController(s);
260         f = { arg server; 
261                 b1.enabled = server.serverRunning;
262                 b2.enabled = server.serverRunning;
263         };
264         a.put(\serverRunning, f);
265         w.onClose = { 
266                 a.remove;
267                 s.sendMsg("/n_free", 1001);             
268         };
269         w.front;
272 s.boot;
275 ////////////////////////////////////////////////////////////////////////
277 // GUI to control a synth
280 SynthDef("trem", { arg freq=800, rate=8, amp=0.1; 
281         var osc;
282         freq = Lag.kr(freq, 0.3);
283         osc = LFTri.ar(freq, 0, SinOsc.kr( rate + [0,0.1],0,amp).max(0));
284         Out.ar(0, osc) 
285 }).writeDefFile;
286 Server.local.sendMsg("/d_load", SynthDef.synthDefDir ++ "trem.scsyndef");
290 var w, f, d, values, server, id, isOn = false;
291 var b1, b2, s;
293 values = IdentityDictionary.new;
294 server = Server.local;
296 f = { arg name, spec = \lin, guispec;
297         var height = 20, v, s, n;
298         guispec = guispec ? spec;
299         spec = spec.asSpec;
300         guispec = guispec.asSpec;
302         v = StaticText(w, Rect(0, 0, 72, height));
303         v.font = Font("Helvetica", 12);
304         v.stringColor = Color.black;
305         v.align = \right;
306         
307         s = Slider(w, Rect(0, 0, 182, height));
308         s.resize = 2;
309         s.action = { 
310                 var val, guival, step;
311                 val = spec.map(s.value);
312                 values.put(name, val);
313                 if (isOn, { server.sendMsg("/n_set", id, name, val); });
314                 guival = guispec.map(s.value);
315                 step = pow(10, floor(min(0, guival.abs.log10 - 2)));
316                 v.string = guival.round(step).asString ++ guispec.units;
317         };
318         s.value = spec.unmap(spec.default);
319         s.action.value;
320         
321         n = StaticText(w, Rect(0, 0, 72, height));      n.string = name;
322         n.stringColor = Color.black;
323         n.font = Font("Helvetica", 12);
324         n.resize = 3;
325         
326         w.view.decorator.nextLine;
329 id = 2001;
330 w = Window("trem", Rect(512, 64, 360, 130));
331 w.view.decorator = d = FlowLayout(w.view.bounds);
333 b1 = Button(w, Rect(0,0, 80, 24));
334 b1.states = [["Load", Color.black, Color.green]];
335 b1.action = { arg view; 
336         server.sendMsg("/d_load", "synthdefs/trem.scsyndef");
338 b1.enabled = server.serverRunning;
340 b2 = Button(w, Rect(0,0, 80, 24));
341 b2.states = [
342         ["Play", Color.black, Color.green],
343         ["Stop", Color.white, Color.red],
345 b2.action = { arg view; 
346         var msg;
347         if (view.value == 1, {
348                 isOn = true;
349                 msg = ["/s_new", "trem", 2001, 1, 0];
350                 values.keysValuesDo({ arg key, value; 
351                         msg = msg.addAll([key, value]); 
352                 });
353                 server.performList(\sendMsg, msg); 
354         },{
355                 isOn = false;
356                 server.sendMsg("/n_free", 2001); 
357         });
359 b2.enabled = server.serverRunning;
360 d.nextLine;
362 f.value(\freq, \freq);
363 f.value(\rate, \lofreq);
364 f.value(\amp, \amp, \db);
366 a = SimpleController(server);
367 f = { arg server; 
368         b1.enabled = server.serverRunning;
369         b2.enabled = server.serverRunning;
370         if (server.serverRunning.not, { b2.value = 0 });
372 a.put(\serverRunning, f);
373 w.onClose = { 
374         if (isOn, { server.sendMsg("/n_free", 2001) });
375         a.remove;
378 w.front;
381 ////////////////////////////////////////////////////////////////////////
385 // create a GUI window with some SCPopUpMenus.
386 var w, n, f, s, a;
387 w = Window("popup menu test", Rect(128, 64, 260, 110));
388 w.view.decorator = f = FlowLayout(w.view.bounds);
389 a = ["linear", \exponential, "very long item name", \sine, "welch", "curve -2", "db fader", "squared", "cubed"];
391 n = PopUpMenu(w, Rect(0,0,80,22));
392 n.items = a;
394 n = PopUpMenu(w, Rect(0,0,80,22));
395 n.items = a;
397 n = PopUpMenu(w, Rect(0,0,80,22));
398 n.items = a;
400 f.nextLine;
402 n = PopUpMenu(w, Rect(0,0,80,22));
403 n.items = a;
404 n.value = 5;
406 n = PopUpMenu(w, Rect(0,0,80,22));
407 n.items = a;
408 n.background = Color.red;
410 n = PopUpMenu(w, Rect(0,0,80,22));
411 n.items = a;
412 n.background = Color.blue;
413 n.stringColor = Color.white;
414 n.value = 3;
415 n.action = { arg view; view.value.postln; };
417 f.nextLine;
419 s = Slider(w, Rect(0,0,240,24));
421 w.front;